#ifndef DSPSIMULATOR_ELF32PROGRAMHEADERTABLE_H
#define DSPSIMULATOR_ELF32PROGRAMHEADERTABLE_H

#include <simulator/type/type.h>

// 段的类型
#define PT_NULL 0       // 表明段未使用，其结构中其他成员都是未定义
#define PT_LOAD 1       // 此类型段为一个可加载的段，大小由 p_filesz 和 p_memsz 描述
#define PT_DYNAMIC 2    // 此类型段给出动态链接信息
#define PT_INTERP 3     // 此类型段给出了一个以 NULL 结尾的字符串的位置和长度，该字符串将被当作解释器调用。这种段类型仅对可执行文件有意义（也可能出现在共享目标文件中）。
#define PT_NOTE 4       // 此类型段给出附加信息的位置和大小
#define PT_SHLIB 5      // 该段类型被保留，不过语义未指定
#define PT_PHDR 6       // 该段类型的数组元素如果存在的话，则给出了程序头部表自身的大小和位置，既包括在文件中也包括在内存中的信息


#define PF_X 0x1            // 段的权限，执行
#define PF_W 0x2            // 段的权限，写
#define PF_R 0x4            // 段的权限，读

// ELF Program Header Table
typedef struct {
    u32 p_type;             // 段的类型
    u32 p_offset;           // 从文件开始到该段开头的第一个字节的偏移
    u32 p_vaddr;            // 该段第一个字节在内存中的虚拟地址
    u32 p_paddr;            // 物理地址
    u32 p_filesz;           // 文件镜像中该段的大小
    u32 p_memsz;            // 内存镜像中该段的大小
    u32 p_flags;            // 与段相关的标记
    u32 p_align;            // 段在文件以及内存中的对齐方式
} Elf32_Phdr;

#endif //DSPSIMULATOR_ELF32PROGRAMHEADERTABLE_H
